package 集合;

import java.util.*;

/**
 * @ClassName : TreeSetText
 * @Author : LV88VL
 * @Date: 2021/3/11 9:55
 * @Description : TreeSet集合、comparable接口（自然链接）、comparator接口（比较器）
 *                          TreeSet的add方法的内部最终实现：
 *                          需要将元素转换成Comparable类型（具有排序能力），
 *                          提供了一个CompareTo方法
 *                          如果要让类具备比较功能，需要让类实现comparable接口
 */
public class TreeSetText {
    public static class Student implements Comparable{
        private String name;
        private  int age;
        public Student(){
            super();
        }
        public Student(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }

        /**
         * 重写compareTo方法，建立**自然排序**
         * *******************************************
         * 在成员对象类中，修改数据困难，建议使用外部类（Comparator）来修改
         *主程序默认在没明确比较器的情况下，默认调用成员类中的comparatorTo方法
         */
        @Override
        public int compareTo(Object o) {
            //先进行强制转换
            if(!(o instanceof Student)){
                throw new ClassCastException();
            }
            Student st = (Student) o;
            /**     单个属性比较
            return this.age - st.age ;
             */
            //多属性比较：
            //注意：在比较时，必须分明主次，主要条件相同，继续比较次要条件
            int temp=this.age-st.age;
            return temp==0?this.name.compareTo(st.name):temp;
        }
    }
    /**
     * 通过使用比较器，来比较学生年龄进行排序
     * *****************************************************
     * 是一个外部类，可以在主程序的外面重新修改，方便
     * ****************************************************
     * 一旦使用了Comparator比较器，在主程序创建对象的同时，就应该明确比较器
     */
    public static class ComparatorName implements Comparator{

        @Override
        public int compare(Object o1, Object o2) {
            //向下转型成学生对象
            Student s1 = (Student) o1;
            Student s2 =(Student) o2;
            //先比较姓名，在比较年龄
            int temp =s1.getName().compareTo(s2.getName());
            return temp==0?s1.getAge()-s2.getAge():temp;
        }
    }
    public static void main(String[] args) {
        //在创建TreeSet集合时，明确比较器ComparatorName()
        TreeSet ts =new TreeSet(new ComparatorName());


        ts.add(new Student("拉拉",11));
        ts.add(new Student("拉拉2",14));
        ts.add(new Student("拉拉5",11));
        ts.add(new Student("拉拉1",2));
        ts.add(new Student("拉拉3",4));
        for (Iterator iterator = ts.iterator(); iterator.hasNext(); ) {
            System.out.println(iterator.next());
        }
    }
}
